近日在OWASP官网发现了这个靶场,融入了OWASP TOP10的漏洞,感觉好像很好玩,花了好几天的时间自己快速地过了一遍。该WP基于 Juice shop v7.0.2(18年版本)。左上可以点开目录,点击直达。

有人说为啥网上writeup都有了要看你的?因为很多wp说的都不清晰不全,大部分还是英文,我在写wp的时候会尽量把知识点写得更清晰,其次,这个靶场更新很快,很多新题目网上都没有wp,我也尽量给上自己的思路和理解。欢迎提出修改意见~

环境搭建

官方的Github源码链接为 https://github.com/bkimminich/juice-shop/

源码NPM安装

注意 Node8 和 Node9 有所不同,具体可见github的安装指南。以下是9的安装步骤

  1. 安装 node.js
  2. 下载源码 git clone https://github.com/bkimminich/juice-shop.git
  3. cd juice-shop
  4. npm install
  5. 运行 npm start
  6. 访问 http://localhost:3000 即可。如果需要

Docker安装(推荐)

之所以推荐这个是因为挂掉了或者是重新开始也能很快地搭建环境。docker使用非常简单:

  1. 安装 Docker
  2. 拉取镜像 docker pull bkimminich/juice-shop
  3. 运行容器 docker run -d -p 3000:3000 bkimminich/juice-shop
  4. 访问 http://localhost:3000 (遇到问题可以到Github上面看看安装指南)

一星难度

Score Board 计分板

Find the carefully hidden ‘Score Board’ page.找到仔细隐藏的“评分板”页面

对于新手来说,根据这个页面可以让自己有目标地进行挖洞,也是让自己有成就感的一种方式。:>

接下来gogogo:

在首页源代码发现了注释的一块代码:

访问该页面 /#/score-board 会跳到计分板,里面有各个难度的说明

Admin Section 管理员页面

Access the administration section of the store. 访问商店的管理页面。

找到后台管理页面。御剑走一波扫不出来,根据描述猜解访问了 http://192.168.209.146:3000/administration,结果发现不行,重新输入 http://192.168.209.146:3000/#/administration 访问成功

结果完成了两个(挠头)

Confidential Document 机密文件

Access a confidential document. 访问机密文件

看到这个一开始不知道哪儿有,搁置了一边之后在中途看到了这个链接:

可能是因为中文的原因,这一行真的太明显了吧。。点开链接 http://192.168.209.146:3000/ftp/legal.md?md_debug=true

访问http://192.168.209.146:3000/ftp 发现可以直接访问其ftp目录

点开一些文件提示403 Error: Only .md and .pdf files are allowed!,这个点是访问了第一个md文件就可以过了。此处还发现了一些bak文件,这个漏洞下面会说到

Error Handling 错误处理

Provoke an error that is not very gracefully handled. 提出一个不太适合处理的错误。

题目的意思是寻找出报错页面,由于上面莫名其妙完成了有点不知所以,docker重置了一波环境,在登录处看到了报错:

报错后即可完成

Redirects Tier 1 重定向第一关

Let us redirect you to a donation site that went out of business. 让我们将您重定向至停业的捐赠网站。

后续测试过程在购物车页面找到注释的重定向网址,实在是太猥琐了

XSS Tier 1 XSS第一关

Perform a reflected XSS attack with . 执行反射 XSS攻击<script>alert("XSS")</script>

搜索框直接可以弹,闭合了反而没有提示完成,略坑=。=

Zero Stars 零星评价

Give a devastating zero-star feedback to the store. 给商店带来毁灭性的零星反馈。

评价链接位于 联系我们 http://192.168.209.146:3001/#/contact,burp改包可过

二星难度

Basket Access 购物车访问

Access someone else’s basket. 访问他人的购物车

修改会话存储的bid,访问购物车即可

Christmas Special 圣诞特别礼

Order the Christmas special offer of 2014. 订购2014年的圣诞特供

搜索框SQL注入。抓包回显了报错语句,明显有SQL注入

分析语句,构造payload为q='))--可以查询出所有商品,添加2014的圣诞特供商品即可

Deprecated Interface 已弃用的接口

Use a deprecated B2B interface that was not properly shut down. 使用未正确关闭的废弃的B2B接口。

B2B接口不清楚是什么,但是在http://192.168.209.146:3001/#/complain页面中有一段注释掉的代码写着B2B,这个地方也可以上传xml文件,但是限定了只能从电脑选择pdf文件。

然而还是可以选xml文件进行上传

上传后返回了410状态码,但是挑战也成功了。

410:被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。

Five-Star Feedback 五星级的反馈

Get rid of all 5-star customer feedback. 删掉所有的5星客户评价

http://192.168.209.146:3000/#/administration页面上,修改bid为1,即可删除

Login Admin 登陆Admin

Log in with the administrator’s user account. 使用管理员用户账号登陆

只能是sql注入了。回到登陆框,抓包看到提交的数据为{"email":"\" or 1=1--","password":"123"},结合sql语句 SELECT * FROM Users WHERE email = '1'' AND password = '202cb962ac59075b964b07152d234b70,payload为 email":"' or 1=1 --","password":"123"即可使用管理员登陆。原因是管理员的数据在select结果处于第一位。

Login MC SafeSearch 登陆MC SafeSearch

Log in with MC SafeSearch’s original user credentials without applying SQL Injection or any other bypass. 使用MC SafeSearch的原始用户凭据登录,无需应用SQL注入或任何其他旁路。

一开始以为是注入,但是题目写了不用注入,最后我也没想到是社工,搜索了一波才知道。

首先有sql注入的话用户都可以枚举,我手动测试了一下,发现{"email":"' or 1=1 limit 7,1 --","password":"123"} 就是MC SafeSearch的邮箱 mc.safesearch@juice-sh.op,使用该payload。

谷歌搜索 MC SafeSearch ,发现一个Rapper唱的关于密码强度的MV

播放视频开始切克闹,发现关键信息

视频 0:25 表示了使用宠物的名字 Mr.Noodles作为密码,然后将一些字母变成了0,一般习惯是将 o 变成 0,所以密码就是 Mr. N00dles。坑点之处在密码中间要加空格,令人头大。

Password Strength 密码强度

Log in with the administrator’s user credentials without previously changing them or applying SQL Injection. 使用管理员的用户凭证登录,而不必事先更改或应用SQL注入。

题目是密码强度,考察点是弱密码。购物篮中有管理员邮箱admin@juice-sh.op,使用burp爆破即可,注意爆破速度不要过快,很容易扫挂掉

Weird Crypto 奇怪的加密

Inform the shop about an algorithm or library it should definitely not use the way it does. 告知商店一个算法或库,它绝对不应该使用它的方式。

http://192.168.209.146:3000/#/contact 提交一个不安全的算法。
这个答案一共有5个:z85 base85 base64 md5 hashid ,提交一个即可。

  • md5: 数据库里面的密码是md5
  • base64: google accounts注册时密码用的b64传输
  • z85/hashid/base85: 六星难度题目出现的算法,后边会讲到

三星难度

Blockchain Tier 1 区块链第一关

Learn about the Token Sale before its official announcement. 在官方宣布前了解一下Token销售

看到题目一怔,是跟区块链比特币有关呢,仔细看了几遍hint。。这个题目暂时搁置了一会儿。

后续在做其他题目的时候看到了 http://192.168.209.146:3001/dist/juice-shop.min.js 这个js文件,搜索token发现里面存在题干关键的Token Sale这个词。关键代码如下:

粘贴这段代码到控制台运行一波

访问这个地址就完成题目了,这道题的意思应该是掩饰了一下地址吧,没太懂

这个地址里面有一些关于区块链ICO白皮书之类的东西,看到这个调侃笑死我了哈哈哈

Forged Feedback 伪造反馈

Post some feedback in another users name. 用其他人的用户提交反馈

http://192.168.209.146:3001/#/contact中提交评价的时候抓包改包,将UserId改成其它即可。

Forgotten Sales Backup 被遗忘的销售备份

Access a salesman’s forgotten backup file. 进入到售货员遗忘的备份文件

在第一关的 Confidential Document 机密文件题目中找到了一个ftp目录,并且该目录限定了只能查看 md 和 pdf 后缀的文件,在这里可以使用%00截断判断下载文件。其他文件同理。

Login Bender 登录Bender

Log in with Bender’s user account.

利用SQL注入即可,payload 为email":"' or 1=1 limit 5,1 --","password":"123 ,修改limit的序列即可

Login Jim 登录Jim

Log in with Jim’s user account.

同上

Payback Time 投资回收期

Place an order that makes you rich. 下一个令你富有的订单。

商品加车漏洞。添加购物车的时候抓包,修改POST数据 {"ProductId":8,"BasketId":"10","quantity":1} 中的quantity为负数,加车后结账金额为负数。

Product Tampering 商品篡改

Change the href of the link within the OWASP SSL Advanced Forensic Tool (O-Saft) product description into http://kimminich.de. 将owasp ssl高级取证工具(o-saft)产品描述中的链接的href更改为http://kimminich.de。

要改产品描述。访问首页,点击一个商品,在Chrome里面选择XHR请求,有几个个API接口,其中有一个包含描述信息的链接如下

http://192.168.209.146:3001/api/Products/1?d=Fri%20Apr%2020%202018 d后面跟的是时间参数,不加的话好像是返回最新修改日期

如果API接口使用了PUT或者DELETE这些危险的HTTP方法的话,数据就很容易被修改。这里试了一下PUT请求,结果是可以搞定的。使用火狐插件 RESTclient ,记得加HTTP头指定类型为 json ,注意要使用{"description": "TEST"}而不能是{"data":{"description": "TEST"}}

所以最后的payload为{"description": "<a href=\"http://kimminich.de\"></a>"}

Reset Jim’s Password 重置Jim的密码

Reset Jim’s password via the Forgot Password mechanism with the original answer to his security question. 通过忘记密码来重置Jim的密码,要求回答他的安全问题

首先通过登陆的SQL注入{"email":"' or 1=1 limit 1,1 --","password":"123"}搞到邮箱号, jim@juice-sh.op。问的安全问题是Your eldest siblings middle name?,这道题没法儿社工啊。

这道题懵逼了,查了别人的解题说是美国的社工?提到JIM会想起 James T. Kirk ?反正我搜JIM只能搜到 Jim Parsons ( Sheldon 扮演者233)

所以正确的解答路径是

  1. 想到 James_T._Kirk ,到Wiki上搜他https://en.wikipedia.org/wiki/James_T._Kirk
  2. 上面写着Jim有个Brother叫 George Samuel Kirk
  3. 所以安全问题的答案就是 Samuel
  4. 重置密码,收工。

Upload Size & Upload Type

Upload a file larger than 100 kB.Upload a file that has no .pdf extension. 上传一个文件大于100kb,上传一个文件不用pdf扩展名

两道题在一块儿写。文件上传跟前面说到的上传XML是同一个点,位于投诉页面。尝试提交,查看XHR请求,很明显有个接口 http://192.168.209.146:3001/file-upload 是用于文件上传的。

此处先用burp截断,点击上传,提示

burp处没有收到请求,说明是前端校验,因此用改包、写脚本等方法直接post到上传接口处即可。

扩展名绕过可以用%2500截断,也可以用如上的方法。

XSS Tier 2 XSS第二关

Perform a persisted XSS attack with bypassing a client-side security mechanism. 绕过客户端安全机制执行存储型 XSS攻击。

xss的输入点其实不多,但是最容易想到的是用户名,注册一个用户。改包修改邮箱为xss语句

{"email":"<script>alert(\"xss3\")</script>","password":"123123","passwordRepeat":"123123","securityQuestion":{"id":1,"question":"Your eldest siblings middle name?<script>alert(/xss/)<script>","createdAt":"2018-04-21T02:42:19.878Z","updatedAt":"2018-04-21T02:42:19.878Z"},"securityAnswer":"123123"}

这个xss能在管理员页面弹出 http://192.168.209.146:3001/#/administration ,商品评论绕过不了,无法xss。

XSS Tier 3 XSS第三关

Perform a persisted XSS attack with without using the frontend application at all. 执行存储型 XSS攻击,根本不使用前端应用程序。

前文我们说道发现了一个API接口http://192.168.209.146:3001/api/Products/9,并且这里可以修改描述信息,这里存在一个存储型的xss。使用 payload {"description":"<script>alert(\"xss\")</script>"} 就阔以了,然而计分板没有显示我完成xss。

后来发现 api/Products 接口可以POST,这里POST一个新的商品也是可以XSS攻击的。注意需要用管理员的 Authorization 进行验证,否则会报401错误。

{% image https://i.loli.net/2018/04/21/5adaa9ed493fa.jpg '' '' %} {% image https://i.loli.net/2018/04/21/5adaaa44d92b6.jpg '' '' %}

XXE Tier 1 XXE第一关

Retrieve the content of C:\Windows\system.ini or /etc/passwd from the server. 用XXE攻击搞到服务器的/etc/passwd

构造xml文件如下

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>

上传到投诉页面的上传点就过了,不过暂时不知道输出点哪儿

update: 使用docker搭建时,XXE的关卡都不可用

四星难度

CSRF

Change Bender’s password into slurmCl4ssic without using SQL Injection. 不用SQL注入修改Bender的密码

只能是重置密码咯,到重置密码那儿抓个包,发现修改密码使用的是GET方式 http://192.168.209.146:3001/rest/user/change-password?current=123123123&new=123123&repeat=123123

经过测试,发现http://192.168.209.146:3001/rest/user/change-password?new=123123&repeat=123123直接就可以返回200,无需原来的密码,此处代码应该是存在 current 关键字时才进行检测,没有就不检测。因此可以利用该链接做一个CSRF攻击。

然后通过SQL注入登录到bender的账户(……),模仿bender点击一下这个链接 http://192.168.209.146:3001/rest/user/change-password?new=slurmCl4ssic&repeat=slurmCl4ssic 触发即可。

一般的CSRF不会让用户发现,这里说明存在CSRF,具体怎么欺骗构造就不说了。

Easter Egg Tier 1 & Easter Egg Tier 2

Find the hidden easter egg.Apply some advanced cryptanalysis to find the real easter egg. 找到隐藏的复活节彩蛋,使用高级点儿密码分析来寻找真正的复活节彩蛋。

还记得FTP目录吗?在里面有个eastere.gg文件,同样使用%00截断即可。

文件下下来后里面有一段密文,明显是base64。转码完成后再用rot13即可找到路径,访问即可,这个页面还是很好玩的233

Eye Candy 秀色可餐

Travel back in time to the golden era of [image] web design. 回到这种老式设计的黄金年代

意思让样式回到这种复古的样子。看这个hot图片的地址为http://192.168.209.146:3001/css/geo-bootstrap/img/hot.gif

这个比较懵圈,看别人的WP是在其CSS框架网址https://github.com/divshot/geo-bootstrap中提到了这个主题的 bootstrap.css 位于 /swatch上。因此打开JS控制台输入 document.getElementById("theme").setAttribute("href", "css/geo-bootstrap/swatch/bootstrap.css");即可

这个主题还是很酷的233

Forgotten Developer Backup 被遗忘的开发者备份

Access a developer’s forgotten backup file.

不用说也知道在哪儿了吧,和前一关一样的地方。方法一样是%00截断下载。

Login Bjoern 登录Bjoern

Log in with Bjoern’s user account without previously changing his password, applying SQL Injection, or hacking his Google account.
要求不能通过改密码、sql注入和社工登录。

之前在折腾xss的时候,发现了一个api接口,返回的是用户的数据,包括密码,所以就放到repeater找Bjoern,看到其密码为32位的,第一个想到的是md5,然而查不到……

这题解不出来,看了WP,是Bjoern(该项目的编写者)通过谷歌的oauth登陆,由于本地搭建的应用是无法跟谷歌oauth互动,所以可以到 http://demo.owasp-juice.shop/ 中去做这个挑战。该作者的email是bjoern.kimminich@googlemail.com

在main.js中搜索oauth,看一下谷歌账号登陆的处理过程:

password的处理是btoa(n.email.split("").reverse().join("")),btoa()函数就是base64的意思,所以这里密码只是根据邮箱变化而得。直接在console执行btoa("bjoern.kimminich@googlemail.com".split("").reverse().join("")),获得密码bW9jLmxpYW1lbGdvb2dAaGNpbmltbWlrLm5yZW9qYg==,使用该账户和密码登陆即可。

Misplaced Signature File 错位的siem签名文件。

Access a misplaced SIEM signature file.访问错位的siem签名文件。

FTP下的 suspicious_errors.yml文件,同样%00截断。

NoSQL Injection Tier 1 NoSQL注入第一关

Let the server sleep for some time. (It has done more than enough hard work for you) 让服务器休眠一段时间。

重点在于能找到该rest接口,存在在评论/rest/product/3/reviews处,商品id参数可控,此处可以执行命令/rest/product/sleep(999)/reviews,相当于一个dos了。

NoSQL Injection Tier 2

Update multiple product reviews at the same time.

与上一题同样的接口,使用NoSQL注入最简单的一个payload,利用正则进行注入{ "id": { "$ne": -1 }, "message": "NoSQL Injection!" }

Redirects Tier 2 重定向第二关

Wherever you go, there you are.

在各个页面搜索一下redirect,在关于我们-Fork me on github的label上找到了该问题:

修改to参数重定向到baidu,返回406报错,此处同样可以完成一星难度的Error Handling

这里的知识点是重定向URL的白名单问题,只要to参数中有白名单域名就可以过,此题有多种解法,使用 /redirect?to=https://www.baidu.com/?a=https://github.com/bkimminich/juice-shop 可过

Reset Bender’s Password 重置Bender的密码

Reset Bender’s password via the Forgot Password mechanism with the original answer to his security question.
通过忘记的密码机制重置Bender密码

在四星难度里已经使用过CSRF重置了Bender的密码,但是一个知识点放有两道题比较奇怪,之后对了一下wp,发现这题还可以有别的解,不过同样也是美国人的思路。

  1. 首先说到Bender,美国人第一个想到的应该是这个动漫角色 Bender
  2. 用重置密码功能,邮箱我们已经知道是bender@juice-sh.op,看密码重置的问题是
  3. 意思是成年后第一份工作的公司是什么,在Bender的wiki中可以看到他现在工作的公司是Futurama,在角色传记里面提到了是FUTURAMA wiki-Suicide booth
  4. 在该wiki里面写到了最重要的一个品牌就是Stop'n'Drop
  5. 填入该公司名称就可以重置了
  6. 总结:这个过程还是培养一个人的社工能力吧,就是国家思维不一样导致理解有点困难,但是思路还是可以学习的。

Typosquatting Tier 1 域名注册第一关

Inform the shop about a typosquatting trick it has become victim of. (Mention the exact name of the culprit) 告知商店他们的库存在typosquatting问题

看记分板的提示是说之前的开发者文件泄露,该题还是翻了别人的WP。
package.json.bak里面有个 epilogue-js ,这个就是typosquatting的库。提交epilogue-js到客户反馈提交即可。

该题的关键点是知道typosquatting是什么东西:

攻击者使用 typosquatting 的方法来上传这些恶意库到 PyPI 平台上,他们上传的恶意库的名字和那些正常的库的名字非常相似,很容易让人混淆,比如将”urlib” 写成 “urllib”。

User Credentials

Retrieve a list of all user credentials via SQL Injection

要求用SQL注入搞到所有用户信息。两个SQL注入点,用搜索框的的注入点就好啦,有回显:qwert')) UNION SELECT '1', id, email, password, '5', '6', '7', '8' FROM Users--

Vulnerable Library 有漏洞的库

Inform the shop about a vulnerable library it is using. (Mention the exact library name and version in your comment)

package.json.baksanitize-html 指定了固定的版本:

这个漏洞就体现在下一题的持久型xss。

XSS Tier 4

Perform a persisted XSS attack with bypassing a server-side security mechanism. 持久型xss

这个题有多个解

  1. 联系我们处存在的一个持久型xss,payload为 <<script>Foo</script>script>alert("XSS")<</script>/script>
  2. 注册User的api处,email参数过滤不严可以造成持久型XSS,administrator登陆后,由于页面有用户信息会直接xss。

五星难度

CAPTCHA Bypass 验证码绕过

Submit 10 or more customer feedbacks within 10 seconds. 在10s内提交10+顾客反馈

一个很入门的脚本编写题,需要在10秒内提交10个以上的反馈。chrome开F12提交一个普通的反馈,查看Network,请求captcha返回的数据为{"captchaId":17,"captcha":"10+4+4","answer":"18"},captcha结果妥妥地躺在返回包中。

再看提交反馈的包,验证码取返回验证码包中的answercaptchaId即验证码id。

写脚本过即可,注意json的处理。

import requests
import json

post_url = 'http://192.168.14.142:3000/api/Feedbacks'
captcha_url = 'http://192.168.14.142:3000/rest/captcha/'
headers = {
    'Content-Type': 'application/json;charset=UTF-8',
    'Cookie': 'cookieconsent_status=dismirequests; continueCode=o1o17zpBWv3DENkqXL89JQYOA6gHbuXH8clgdwM2ZV4jgKnxR5rmyabPle6j; io=6xLNWoRR4wKbTGiEAAAK'
}
data = {"comment": "terrrible", "rating": 1, "captcha": "55", "captchaId": 5}

for _ in range(15):
    captcha = requests.get(captcha_url).json()
    data['captcha'] = captcha['answer']
    data['captchaId'] = captcha['captchaId']
    print(requests.post(post_url, data=json.dumps(data), headers=headers, timeout=1).text)

Extra Language 额外的语言

Retrieve the language file that never made it into production. 找到一个不在生产环境出现过的语言文件

妥妥的脑洞题。在Burp中看浏览记录,语言文件的目录在/i18n下,文件名为/i18n/en.json,根据命名规则,用两位字母+下划线+两位字母爆破的话量太大了……

还是看了一下别人的writeup,原来是tlh_AA.json,克林贡语。还是学习一下Intruder的用法吧:

  1. 选择Cluster bomb模式:
  1. Payloads中选择Payload TypeBrute forcer爆破模式,min length最小长度选择为2,max length最大长度选择为2即可。

JWT Issues Tier 1 JWT问题第一关

Forge an essentially unsigned JWT token that impersonates the (non-existing) user jwtn3d@juice-sh.op. 伪造一个基本上未签名的JWT token,仿冒(不存在的)用户jwtn3d@juice-sh.op

先解释一下什么叫JWT:

JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。缺点是无法作废已颁布的令牌/不易应对数据过期。

以下是解题过程

  1. 抓登陆的包,返回token就是JWT↓

对JWT解码最常用的是到 jwt.io 解密,采用默认的RS256算法即可解码 。Decoded处的Header说明了采用的算法alg和Token类型typ,Payload处则是该token解码后的内容,Verified signature是签名,这三项分别对应Encoded处三处以.号分割的不同颜色的payload。↓

  1. 这道题考察点在于,JWT的Header和Payload是通过base64编码得到,意思是Header和Payload很容易被伪造,而不同的算法只是用于对数据进行签名校验而已。因此,如果服务器不检验签名或检验签名的流程有问题,那么直接解码Payload验证用户信息则会造成漏洞。所以,该题我们需要仿冒用户jwtn3d@juice-sh.op的话需要修改Header的算法为none,修改Payload的用户邮箱和Exp(过期账户时间,调大一点就可以),将header和payload进行base64编码后,用.连接Header和Payload,注意最后面多加一个.,用于标识签名为空:↓
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJpZCI6MSwiZW1haWwiOiJqd3RuM2RAanVpY2Utc2gub3AiLCJwYXNzd29yZCI6IjAxOTIwMjNhN2JiZDczMjUwNTE2ZjA2OWRmMThiNTAwIiwiY3JlYXRlZEF0IjoiMjAxOC0wOC0xMiAwNzo1MzozOC4wNjQgKzAwOjAwIiwidXBkYXRlZEF0IjoiMjAxOC0wOC0xMiAwNzo1MzozOC4wNjQgKzAwOjAwIn0sImlhdCI6MTUzNDA2MDUzOSwiZXhwIjoxNTU0MDc4NTM5fQ.
{% image https://i.loli.net/2018/12/18/5c18e65baa15e.jpg '' '' %}
  1. 使用Modify Header修改Authorization请求头,注意该请求头前面有Bearer前缀。由于服务器端会验证算法,服务端接收到我们构造的如下Payload后,解码得到该Auth算法为None,服务器运行算法None(就是什么也没有)后得出的签名结果为None,与请求的签名(为空)对比,验证通过!这就达到了我们伪造JWT的目的。↓
{% image https://i.loli.net/2018/12/18/5c18e4a20e393.jpg '' '' %}

Login CISO 登录CISO

Exploit OAuth 2.0 to log in with the Chief Information Security Officer’s user account. 利用OAuth 2.0登录CSO的帐户

还是从OAuth说起,OAuth是一种授权框架,OAuth2协议定义了一套用户、第三方服务和存储着用户数据的平台之间的交互规则,可以使得用户无需将自己的用户名和密码暴露给第三方,即可使第三方应用获取用户在该平台上的数据,最常见的场景便是现在互联网上的各种使用XXX账号登录,JWT算是其中的一种认证机制。

以下是解题过程

  1. 如果你还记得前面Bjoern谷歌登陆,密码是base64(邮箱)的那道题的话,可以回去翻看一下js文件,这里使用到的就是OAuth登陆方式。在前面的SQL注入中,我们拉取到了所有用户的列表,其中有个邮箱为ciso@juice-sh.op即为CISO的邮箱。

  2. 在Juice Shop里面,登陆功能中有个记住用户的勾选,返回的参数中含有一个umail,并且之后的请求中请求头会有一个X-User-Email,本地Cookie中也有一个email的cookie

    {% image https://i.loli.net/2018/12/19/5c19bdcd9e4da.jpg '' '' %} {% image https://i.loli.net/2018/12/18/5c18ea88b9bb5.jpg '' '' %} {% image https://i.loli.net/2018/12/19/5c19c27f2b053.jpg '' '' %}
  3. 因此我们使用ciso@juice-sh.op登陆,密码任意,即使登陆失败后

  4. 做到这里歇菜了,看别人WP可以通过两种方式走Oauth认证:

    1. demo.owasp-juice.shop 上勾选记住用户,使用自己的google账户登陆,然后修改X-User-Email字段为CISO的邮箱即可

    2. 在Login的时候

无法复现

RCE Tier 1 RCE第一关

Perform a Remote Code Execution that would keep a less hardened application busy forever. 执行远程执行代码,让一个持久性较差的应用程序处于繁忙状态。

  1. 在目录探测时候发现了/api-docs/,该目录是商城API的文档
  2. 该处可以直接编辑请求表单执行,看到这里就想到可能存在代码执行的问题。{% image https://i.loli.net/2018/12/26/5c22d486619d3.jpg '' '' %}

请求JSON如下,并且还需要点击Authorize按钮,输入自己的bearerAuth(就是前面说到的JWT token)进行身份认证

{
  "cid": "JS0815DE",
  "orderLines": [
    {
      "productId": 8,
      "quantity": 500,
      "customerReference": "PO0000001"
    }
  ],
  "orderLinesData": "[{\"productId\": 12,\"quantity\": 10000,\"customerReference\": [\"PO0000001.2\", \"SM20180105|042\"],\"couponCode\": \"pes[Bh.u*t\"},{\"productId\": 13,\"quantity\": 2000,\"customerReference\": \"PO0000003.4\"}]"
}
  1. 点击Execute,可以看到在执行的为curl命令,JSON的orderLinesData带入了命令,此处存在代码执行的问题,但是利用不会,所以用了别人的Payload:

  2. 替换JSON为 {"orderLinesData": "(function dos() { while(true); })()"},作用是使该命令进入死循环,发出后服务器返回500,该处pass。

Reset Bjoern’s Password 重置Bjoern的密码

Reset Bjoern’s password via the Forgot Password mechanism with the original answer to his security question. 通过忘记密码机制重置Bjoern的密码,并附上他的安全问题的原始答案。

Reset Morty’s Password 重置Morty的密码

Reset Morty’s password via the Forgot Password mechanism with his obfuscated answer to his security question. 通过忘记密码机制重置Morty的密码,并对其安全问题进行模糊回答。

Retrieve Blueprint 检索Blueprint

Deprive the shop of earnings by downloading the blueprint for one of its products. 通过下载其中一个产品的Blurprint来移除商店的收入。

Typosquatting Tier 2 注册近似域名 第二关

Inform the shop about a more literal instance of typosquatting it fell for. (Mention the exact name of the culprit) 告知商店一个更为文字化的域名抢注案例。

XXE Tier 2 XXE第二关

Give the server something to chew on for quite a while. 上传一个文件让服务器繁忙。

六星难度

累了,之后持续更新补上